#ifndef __DEV_DATA_H__
#define __DEV_DATA_H__

#include <config.h>
#include <iostream>

#include "zlog.h"
using namespace std;

#define MAX_RSP_NUM (256 / 4 - 4) // 最大RSP数量,限制于每个modbus tcp帧只能发送256个数据
/**
 * @brief 事务处理标识符 功能码定义
 *
 */
enum OPS : uint8_t
{
    READ = 0X03,  // 读取数据
    WRITE = 0X10, // 写入数据
    PUSH = 0X04,  // 推送数据
};
// Modbus 异常码枚举（基于 Modbus 协议规范）
enum ModbusExceptionCode : uint8_t
{
    ILLEGAL_FUNCTION = 0x01,        // 非法功能
    ILLEGAL_DATA_ADDRESS = 0x02,    // 非法数据地址
    ILLEGAL_DATA_VALUE = 0x03,      // 非法数据值
    SLAVE_DEVICE_FAILURE = 0x04,    // 从站设备故障
    ACKNOWLEDGE = 0x05,             // 确认
    SLAVE_DEVICE_BUSY = 0x06,       // 从站设备忙
    MEMORY_PARITY_ERROR = 0x08,     // 存储奇偶校验错误
    GATEWAY_PATH_UNAVAILABLE = 0x0A // 网关路径不可用
};

/*  =======  uint8_t dev_type;//单元标识符设备类型表============= 000319                020319
序号	设备类型		编号（Hex）
0	        所有设备	所有设备	                                          0x00
1	        手足类检测设备	壁挂式手污染监测仪	           0x50
2	        手足类检测设备	简易手脚污染检测仪	            0x51
3	        手足类监测设备	手脚污染检测仪	                    0x52
4	        C2门类	C2门	                                                        0x0c
5	        C1门类	C1门	                                                        0x11
 =======  uint8_t dev_type;//单元标识符设备类型表=============*/
enum DEV : uint8_t
{
    ALL = 0,               // 所有设备
    HANG_HANDER = 0X50,    // 壁挂式手污染监测仪
    SIMPLE_HANDER = 0X51,  // 简易手脚污染检测仪
    SIMPLE2_HANDER = 0X52, // 手脚污染检测仪
    DOOR_C1 = 0X0C,        // C2门类
    DOOR_C2 = 0X11,        // C1门类
};

// 设备状态
enum DeviceStatus : uint32_t
{
    SELF_CHECKING = 0,             // 自检中
    FAULT = 1,                     // 故障（RSP 或设备机体故障）
    OFFLINE = 2,                   // 脱机（疑似无效）
    REMOTE_MANAGEMENT = 3,         // 托管 / 远程管理（与9重复，可统一）
    POLLUTION_ALARM = 4,           // 污染（报警）
    BACKGROUND_MEASUREMENT = 5,    // 本底测量
    MEASUREMENT_ACTIVE = 6,        // 测量状态中（正式倒计时，开始判断数据）
    OVERSPEED_ALARM = 7,           // 超速（报警），仅 CSM 设备车辆模式
    LOCAL_LOGIN = 8,               // 设备端本地登录管理
    REMOTE_CONTROL = 9,            // 远程管理（与3重复，建议统一）
    EMERGENCY_MODE = 10,           // 应急模式
    READY_FOR_MEASUREMENT = 11,    // 准备测量
    MEASUREMENT_WAITING = 12,      // 测量中等待就绪（站位、门控等未完成）
    NOT_POLLUTED = 13,             // 未污染
    PASS_THROUGH_MODE = 14,        // 穿行模式（C1门工作模式之一）
    FRONT_MEASUREMENT_RESULT = 15, // 正面测量结果（新增）
    BACK_MEASUREMENT_RESULT = 16   // 反面测量结果（新增）
};

/*
    读取 寄存器定义	寄存器序号
*/
enum class DEV_REG : uint16_t
{
    HEART = 0x0000, // 心跳

    TEST_COUNT = 0x0100,     // 测量次数统计 (占用 2 个寄存器: 0x0101 ~ 0x0102)
    ALARM_COUNT = 0x0102,    // 报警次数统计 (占用 2 个寄存器: 0x0103 ~ 0x0104)
    WORK_STATUS = 0x0104,    // 工作状态查询
    READ_PERSON_ID = 0x0106, // 读当前测量人员编号 (0x0105 ~ 0x010E, 占用 10 个寄存器)

    ALARM_MODE = 0x0200,                // 报警阈值模式
    STATIC_GAMMA_THRESHOLD = 0x0202,    // 静态gamma阈值 (0x011A ~ 0x011B)
    STATIC_BETA_THRESHOLD = 0x0204,     // 静态beta阈值 (0x011C ~ 0x011D)
    STATIC_ALPHA_THRESHOLD = 0x0206,    // 静态alpha阈值 (0x011E ~ 0x011F)
    STATIC_GAMMA_SEVERE = 0x00208,      // 静态Gamma严重阈值 (0x0120 ~ 0x0121)
    STATIC_BETA_SEVERE = 0x020a,        // 静态beta严重阈值 (0x0122 ~ 0x0123)
    STATIC_ALPHA_SEVERE = 0x020c,       // 静态alpha严重阈值 (0x0124 ~ 0x0125)
    DYNAMIC_GAMMA_COEF = 0x020e,        // 动态gamma系数 (0x0126 ~ 0x0127)
    DYNAMIC_BETA_COEF = 0x0210,         // 动态beta系数 (0x0128 ~ 0x0129)
    DYNAMIC_ALPHA_COEF = 0x0212,        // 动态alpha系数 (0x012A ~ 0x012B)
    DYNAMIC_GAMMA_SEVERE_COEF = 0x0214, // 动态Gamma严重系数 (0x012C ~ 0x012D)
    DYNAMIC_BETA_SEVERE_COEF = 0x0216,  // 动态beta严重系数 (0x012E ~ 0x012F)
    DYNAMIC_ALPHA_SEVERE_COEF = 0x0218, // 动态alpha严重系数 (0x0130 ~ 0x0131)

    SYNC_TIME = 0x0300,     // 同步时间
    SYNC_TIME_END = 0x0305, // 同步时间END

    PUSH_ALARM_OK = 0X1200, // 报警确认	02 02
    POWER_OFF = 0X1201,     // 关机	02 03

    REGS_START_RSP_STATUS = 0X0400, // RSP状态	0Xxxxx    (uint32_t 4字节RSP状态)
    REGS_START_RSP_STATUS_MAX = REGS_START_RSP_STATUS + MAX_RSP_NUM * 2,

    REGS_START_ALPHA = 0X0500, // RSP  alpha数据	 4字节，float型,α射线值
    REGS_START_ALPHA_MAX = REGS_START_ALPHA + MAX_RSP_NUM * 2,

    REGS_START_BATE = 0X00600, // RSP    beta数据	   4字节，float型,beta射线值
    REGS_START_BATE_MAX = REGS_START_BATE + MAX_RSP_NUM * 2,

    REGS_START_GAMA = 0X0700, // RSP     GAMA数据	    4字节，float型,γ射线值
    REGS_START_GAMA_MAX = REGS_START_GAMA + MAX_RSP_NUM * 2,

};

enum class EVENT : uint32_t
{
    SYNC_RTC_TIMESTAMP = 0X01U << 0,  // 同步时间戳
    GET_THRESHOLD_PARAM = 0X01U << 1, // 获取阈值参数
    HEART_BEAT = 0X01U << 3,          // 心跳包
    GET_DEV_CONFIG = 0X01U << 4,      // 获取设备配置

    RSP_DATA_BASE_STATUS = 0X01U << 5, // RSP数据
    RSP_DATA_BASE_ALPHA = 0X01U << 6,  // RSP数据
    RSP_DATA_BASE_BETA = 0X01U << 7,   // RSP数据
    RSP_DATA_BASE_GAMA = 0X01U << 8,   // RSP数据
    RSP_DATA_BASE_OTHERS = 0X01U << 9, // RSP数据

};

struct dev_data
{
    uint16_t reg_heart;       // 心跳	00 00
    uint32_t reg_test_count;  // 测量次数统计	01 01 ~ 01 02
    uint32_t reg_alarm_count; // 报警次数统计	01 03 ~ 01 04
    uint32_t reg_status;      // 设备状态查询	01 32

    uint32_t reg_read_person_id[5]; // 读取当前测量人员编号 10个寄存器  01 05 ~ 01 0E =>20 Byte

    uint32_t reg_alarm_mode;          // 报警阈值模式	01 19//1，动态阈值;2，静态阈值
    float reg_static_gamma_threshold; // 静态gamma阈值	01 1a ~ 01 1b
    float reg_static_beta_threshold;  // 静态beta阈值	01 1c ~ 01 1d
    float reg_static_alpha_threshold; // 静态alpha阈值	01 1e ~ 01 1f
    float reg_static_gamma_severe;    // 静态Gamma严重阈值	01 20 ~ 01 21
    float reg_static_beta_severe;     // 静态beta严重阈值	01 22 ~ 01 23
    float reg_static_alpha_severe;    // 静态alpha严重阈值	01 24 ~ 01 25

    float reg_dynamic_gamma_coff;         // 动态gamma系数	01 26 ~ 01 27
    float reg_dynamic_beta_coff;          // 动态beta系数	01 28 ~ 01 29
    float reg_dynamic_alpha_coff;         // 动态alpha系数	01 2a ~ 01 2b
    float reg_dynamic_gamma_severe_coff;  // 动态Gamma严重系数	01 2c ~ 01 2d
    float reg_dynamic_beta_severe_coff;   // 动态beta严重系数	01 2e ~ 01 2f
    float reg_dynamic_alpha_severe_coff;  // 动态alpha严重系数	01 30 ~ 01 31
    uint16_t reg_rtc_time[6];             // 实时时间查询	0133-01 37
    uint16_t reg_alarm_pub;               // 报警确认	0200
    uint16_t reg_power_off;               // 	关机 0201
    uint16_t reg_rsp_num;                 // RSP数量查询
    uint32_t reg_rsp_use_bit;             // RSP使用位查询
    uint32_t reg_rsp_status[MAX_RSP_NUM]; // RSP的状态查询       03 01~03 1A （1~26号RSP）

    float reg_rsp_alpha_valt[MAX_RSP_NUM]; // RSP的alpha值       04 01~ 04 1A（1~26号RSP）
    float reg_rsp_bate_valt[MAX_RSP_NUM];  // RSP的bate值    05 01~ 05 1A（1~26号RSP）
    float reg_rsp_gama_valt[MAX_RSP_NUM];  // RSP的bate值        06 01~ 06 1A（1~26号RSP）

    // 测量结果每个射线都有一个状态
    // uint16_t reg_rsp_alpha_status[MAX_RSP_NUM];
    // uint16_t reg_rsp_beta_status[MAX_RSP_NUM];
    // uint16_t reg_rsp_gama_status[MAX_RSP_NUM];

    float reg_rsp_alpha_result_valt[MAX_RSP_NUM]; // RSP的alpha值       04 01~ 04 1A（1~26号RSP）
    float reg_rsp_bate_result_valt[MAX_RSP_NUM];  // RSP的bate值    05 01~ 05 1A（1~26号RSP）
    float reg_rsp_gama_result_valt[MAX_RSP_NUM];  // RSP的bate值        06 01~ 06 1A（1~26号RSP）

    // 推理的数据根据rsp的数量得来
    uint16_t reg_dev_type; // 设备类型查询	01 33
};

/**
 * 本底状态数据0
 * 测量阿尔法状态值1
 * 测量贝塔状态值2
 * 测量伽马状态值3
 * 本底阿尔法值4
 * 本底贝塔值5
 * 本底伽马值6
 * 测量结果阿尔法值7
 * 测量结果贝塔值8
 * 测量结果伽马值9
 */
enum class PUSH_DATA_TYPE : uint16_t
{
    BackgroundStatus = 0x400,     // 本底状态数据
    BackgroundAlphaValue = 0x500, // 本底阿尔法值
    BackgroundBetaValue = 0x600,  // 本底贝塔值
    BackgroundGammaValue = 0x700, // 本底伽马值
    MeasurementOthers = 0xA00     // 测量结果其他附加数据
};
// 探测器单组数据
struct DetectorData
{
    uint16_t status;   // 探测器状态 (2字节)
    float alpha_value; // α射线值 (4字节)
    float beta_value;  // β射线值 (4字节)
}; // 每组共 10 字节

// 主动上传数据包结构体
struct UploadPacket
{
    uint16_t header;                     // 固定值 0x0113（注意：小端序为 13 01）
    uint16_t device_status;              // 设备总状态 (2字节)
    DetectorData detectors[MAX_RSP_NUM]; // 26组探测器数据
}; // 总大小：2 + 2 + 26 * 10 = 264 字节

/* =========================  函数声明 ========================== */

#endif